package com.pearadmin.pro.modules.ser.util;

import ch.qos.logback.core.util.FileSize;
import com.jcraft.jsch.*;
import com.pearadmin.pro.modules.ser.pojo.FileDTO;
import com.pearadmin.pro.modules.ser.pojo.SFTPConnectInfo;
import com.pearadmin.pro.modules.ser.pojo.WebSSHData;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Vector;

/**
 * Author: didiplus
 * Email: 972479352@qq.com
 * CreateTime: 2022/3/15
 * Desc: SFTP工具类
 */

@Slf4j
public class SFTPUtil {

    public  static  void  getConnect(SFTPConnectInfo sftpConnectInfo, WebSSHData webSSHData) throws Exception{
        String host = webSSHData.getHost();
        int port = webSSHData.getPort();
        String username = webSSHData.getUsername();
        String password = webSSHData.getPassword();
        Channel channel =null;
        JSch jSch = new JSch();
        Session session = jSch.getSession(username, host, port);
        session.setPassword(password);
        Properties config = new Properties();
        // 不验证 HostKey
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        try{
            session.connect(5000);
        }catch (Exception e) {
            if(session.isConnected()){
                session.disconnect();
            }
            log.error("连接服务器失败,请检查主机[" + host + "],端口[" + port
                    + "],用户名[" + username + "],端口[" + port
                    + "]是否正确,以上信息正确的情况下请检查网络连接是否正常或者请求被防火墙拒绝.");
        }
        channel = session.openChannel("sftp");
        try {
            channel.connect();
        } catch (Exception e) {
            if (channel.isConnected()) {
                channel.disconnect();
            }
            log.error("连接服务器失败,请检查主机[" + host + "],端口[" + port
                    + "],用户名[" + username + "],密码是否正确,以上信息正确的情况下请检查网络连接是否正常或者请求被防火墙拒绝.");
        }
        ChannelSftp sftp = (ChannelSftp) channel;
        sftpConnectInfo.setSftp(sftp);
        sftpConnectInfo.setSession(session);
        sftpConnectInfo.setChannel(channel);

    }


    /**
     * 列出目录下的文件
     *
     * @param directory 要列出的目录
     * @return list 文件名列表
     * @throws Exception
     */
    public static List<FileDTO> listFiles(String directory, SFTPConnectInfo sftpConnectInfo) {
        ChannelSftp sftp = sftpConnectInfo.getSftp();
        List<FileDTO> fileDTOs = new ArrayList<>();
        //返回目录下所有文件名称
        try {
            Vector<ChannelSftp.LsEntry> fileList = sftp.ls(directory);
            for(ChannelSftp.LsEntry entry : fileList) {
                if("..".equals(entry.getFilename()) || ".".equals(entry.getFilename())){
                    continue;
                }
                FileDTO fileDTO = new FileDTO();
                fileDTO.setFileName(entry.getFilename());
                fileDTO.setFileSize(new FileSize(entry.getAttrs().getSize()).toString());
                fileDTO.setIsDir(entry.getAttrs().isDir());
                if("/".equals(directory)){
                    fileDTO.setFullFileName(directory.concat(entry.getFilename()));
                }else{
                    fileDTO.setFullFileName(directory.concat("/").concat(entry.getFilename()));
                }
                fileDTO.setMtime(entry.getAttrs().getMtimeString());
                fileDTOs.add(fileDTO);
            }
        } catch (SftpException e) {
            e.printStackTrace();
        }
        return  fileDTOs;
    }
}
